﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProjetoJornada_DAL.Repositorio;
using Basicas;
using Basicas.Utils;
using Basicas.Utils.excecoes;

namespace ProjetoJornada_Negocios.Negocio
{
    public class NegocioJornada
    {

        #region Atributo
        private RepJornada repJornada;
        private RepResponsavel repResponsavel;
        #endregion

        #region Construtor
        public NegocioJornada()
        {
            this.repJornada = new RepJornada();
            this.repResponsavel = new RepResponsavel();
        }
        #endregion

        #region Metodos
        public Int32 Inserir(Jornada jornada)
        {
            try
            {
                DateTime dataFinal = jornada.DataFinal;
                DateTime dataInicial = jornada.DataInicial;

                if (dataFinal.CompareTo(dataInicial) < 0)
                {
                    throw new PeriodoInvalidoException();
                }               

                Responsavel responsavel = jornada.Responsavel;
                if (responsavel == null)
                {
                    throw new JornadaSemResponsavelException();
                }              

                int iDResponsavel = repResponsavel.Inserir(responsavel);
                jornada.Responsavel.Id = iDResponsavel;
                
                int idJornada = repJornada.Inserir(jornada);

                this.SetDefault(idJornada);

                return idJornada;
                
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "inserirJornada");
                throw ex;
            }
        }

        public Boolean Remover(int id)
        {
            try
            {
                Jornada jornada = this.ConsultarJornadaPorId(id);
                if (jornada.Eh_default)
                {
                    bool retorno = repJornada.Remover(id);
                    int novaJornadaDefaultId = this.SelecionarUltimainserida();
                    this.SetDefault(novaJornadaDefaultId);
                    return retorno;
                }
                else
                {
                    return repJornada.Remover(id);
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "removerJornada - Negocio");
                throw ex;
            }
        }

        public Boolean Editar(Jornada jornada)
        {
            try
            {
                DateTime dataFinal = jornada.DataFinal;
                DateTime dataInicial = jornada.DataInicial;

                if (dataFinal.CompareTo(dataInicial) < 0)
                {
                    throw new PeriodoInvalidoException();
                }      

                return this.repJornada.Editar(jornada);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "editarJornada - Negocio");
                throw ex;
            }
        }

        public Jornada ConsultarJornadaPorId(int id)
        {
            try
            {
                return this.repJornada.ConsultarJornadaPorId(id);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "ConsultarJornadaPorId");
                throw ex;
            }
        }

        public List<Jornada> ConsultarTodasJornadas()
        {
            List<Jornada> jornadas = this.repJornada.ConsultarTodasJornadas();

            if (jornadas.Count == 0)
            {
                throw new NenhumaJornadaCadastradaException();
            }
            return jornadas;
        }

        public double ConsultarFaturamento(int idJornada)
        {
            try
            {
                return this.repJornada.ConsultarFaturamento(idJornada);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "ConsultarFaturamento");
                throw ex;
            }
        }

        public int ConsultarQuatidadeTotalDeAlunos(int idJornada)
        {
            try
            {
                return this.repJornada.ConsultarQuatidadeTotalDeAlunos(idJornada);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "ConsultarQuatidadeTotalDeAlunos");
                throw ex;
            }
        }

        public void SetDefault(int idJornada)
        {
            try
            {
                this.repJornada.SetDefault(idJornada);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "SetDefault");
                throw ex;
            }
        }

        public int SelecionarUltimainserida()
        {
            try
            {
                return this.repJornada.SelecionarUltimainserida();
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "SelecionarUltimainserida");
                throw ex;
            }
        }

        #endregion
    }
}
